package cn.hinglo.gameclaw.client.service;

import cn.hinglo.gameclaw.client.dao.SignDao;
import cn.hinglo.gameclaw.data.entity.Result;
import cn.hinglo.gameclaw.data.utils.ResultUtils;
import cn.hinglo.gameclaw.user.bean.Sign;
import cn.hutool.core.date.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @createTime: 2018/1/2
 * @author: HingLo
 * @description: 签到处理的服务
 */
@Service
public class SignService {
    private final SignDao signDao;

    @Autowired
    public SignService(SignDao signDao) {
        this.signDao = signDao;
    }

    /**
     * 通过用户的Id 查询全部的签到记录，主要用于系统管理员查看
     *
     * @param userId 用户的Id
     * @return 所有签到记录
     */
    public Result listAllSignService(String userId) {
        //构造查询条件
        Sign sign = new Sign();
        sign.setUserId(userId);
        // 查询
        List<Sign> signList = signDao.select(sign);
        return ResultUtils.success(signList);
    }


    /***
     *查询签到记录
     * @param userId 用户的Id
     * @return 最近签到记录
     */
    public Result listSignService(String userId) {
        //查询历史签到记录
        List<Sign> signList = signDao.listSignDao(userId);

        //如果没有记录或者已经连续7天签到
        if (signList.isEmpty()) {
            return ResultUtils.success(signList);
        } else {
            int i = -1;
            //用于存放连续签到的数据
            List<Sign> list = new ArrayList<>();
            Date nowDay = new Date();
            //连续签到的数据
            for (Sign sign : signList) {
                Date date = sign.getDate();
                String format = DateUtil.format(date, "yyyy-MM-dd");
                String d = DateUtil.format(DateUtil.offsetDay(nowDay, i), "yyyy-MM-dd");
                if (format.equals(d)) {
                    list.add(sign);
                    i--;//获取上一天的日期
                } else {
                    //如果断天了，就结束解析他连续签到了多少天
                    break;
                }
            }
            //********** 下面开始处理连续签到的天数*******************//
            // 连续签到的总天数
            int len = list.size();
            if (len % 7 == 0) {
                //如果连续签到了7天就直接返回[]
                list.clear();
                return ResultUtils.success(list);
            } else {
                len = len % 7;
                return ResultUtils.success(list.subList(0, len));
            }
        }

    }

    /***
     * 添加签到记录
     * @param sign 签到对象
     * @return 返回添加结果
     */
    @Transactional(rollbackFor = RuntimeException.class)
    public Result addSignService(Sign sign) {
        sign.setDate(new Date());
        //检测今天是否已经签到了
        if (!checkSignService(sign.getUserId())) {
            //添加签到记录，并修改 赠送的 钻石数量
            if (signDao.insert(sign) > 0 && signDao.updateGiveGold(sign.getGold(), sign.getUserId()) > 0) {
                return ResultUtils.success();
            } else {
                throw new RuntimeException("签到记录添加失败");
            }
        } else {
            return ResultUtils.error("已经签到了");
        }
    }


    /**
     * 检测当前的用户今天是否已经签到
     * 若果已经签到，返回True
     * 没有签到  返回False
     *
     * @param userId 用户的Id
     * @return 是否签到
     */
    public boolean checkSignService(String userId) {
        Sign sign = new Sign();
        sign.setUserId(userId);
        sign.setDate(new Date());
        List<Sign> signList = signDao.select(sign);
        return !signList.isEmpty();
    }
}
